/* 
 * JornadaTrabalhoInsertUpdateRule.java
 * 
 * Data de criação: 03/10/2010
 * 
 * O2SOLUTIONS - SOLUÇÕES EM TECNOLOGIA DA INFORMAÇÃO.ÇÕES EM TECNOLOGIA DA INFORMAÇÃO. 
 *
 */
package br.com.o2solutions.siso.business.rule.jornada.trabalho;

import java.util.Collection;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import br.com.o2solutions.core.exception.BusinessException;
import br.com.o2solutions.core.exception.enumerator.ExceptionScope;
import br.com.o2solutions.core.integration.repository.DataBaseIntegration;
import br.com.o2solutions.core.service.rule.Rule;
import br.com.o2solutions.siso.integration.entidade.Ala;
import br.com.o2solutions.siso.integration.entidade.JornadaTrabalho;
import br.com.o2solutions.util.assertion.Assert;

/**
 * Realiza a verificação do processo de remoção da {@link JornadaTrabalho}
 * impedindo a remoção caso a {@link JornadaTrabalho} esteja associada a uma
 * {@link Ala}.
 * 
 * @author Osvaldeir
 * @since 03/10/2010
 * 
 */
@Component("jornadaTrabalhoRemoveRule")
public class JornadaTrabalhoRemoveRule implements Rule<JornadaTrabalho> {

	@Value("#{jornadaTrabalhoDAO}")
	private DataBaseIntegration<JornadaTrabalho> jornadaTrabalhoDAO;

	/**
	 * {@inheritDoc} Verifica se a {@link JornadaTrabalho} está vinculada a uma
	 * {@link Ala} e, caso positivo, lança uma {@link BusinessException} com a
	 * chave <b>error.jornada.trabalho.exists.ala</b> e a mensagem descritiva da
	 * exceção.
	 */
	@Override
	public void check(JornadaTrabalho jornadaTrabalho) throws BusinessException {
		Assert.notNull(jornadaTrabalho.getId(), new BusinessException(
				"A entidade a ser removida não pode ter o id nulo"));
		Collection<? extends Object> result = jornadaTrabalhoDAO
				.findByNamedQuery("JornadaTrabalho.countAlasVinculadas",
						jornadaTrabalho.getId());
		Long count = (Long) result.iterator().next();
		Assert.isTrue(
				count == 0,
				new BusinessException(
						"A Jornada de Trabalho a ser removida está relacionada a Alas. Remova primeiramente o relacionamento",
						"error.jornada.trabalho.exists.ala",
						ExceptionScope.BUSINESS_VALIDATION));
	}

}
